package main

/*
* Content: zap包基础使用、简单使用、定制输出日志
* --------------------------------------------------
* GO语言框架中如何快速集成日志模块: https://juejin.cn/post/7119390985863299085
* zap日志级别: https://blog.csdn.net/weixin_52025712/article/details/124693152
 */

import (
	"fmt"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"time"
)

func MyBagLogZap() {

	// zap包基础使用
	fmt.Println("--------------------zap包基础使用--------------------")
	// zap 是一个可以在 go项目 中进行快速, 结构化且分级的 日志记录包, git star数高达16.3k

	// 基本使用
	logger, _ := zap.NewProduction()
	defer logger.Sync()

	// 八个等级: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
	logger.Info("log info msg",
		zap.String("name", "谢清照"),
		zap.Int("age", 17),
		zap.Duration("timer", time.Minute),
	)

	// 简单使用
	fmt.Println("--------------------简单使用--------------------")
	zap.L().Error("简单使用zap日志！", zap.String("name", "谢清照"))

	// 定制输出日志
	fmt.Println("--------------------定制输出日志--------------------")
	conf := zap.NewProductionConfig()

	// 可以把输出方式改为控制台编码, 更容易阅读
	conf.Encoding = "console"

	// 时间格式自定义
	conf.EncoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + t.Format("2006-01-02 15:04:05") + "]")
	}
	// 打印路径自定义
	conf.EncoderConfig.EncodeCaller = func(caller zapcore.EntryCaller, encoder zapcore.PrimitiveArrayEncoder) {
		encoder.AppendString("[" + caller.TrimmedPath() + "]")
	}
	// 级别显示自定义
	conf.EncoderConfig.EncodeLevel = func(level zapcore.Level, encoder zapcore.PrimitiveArrayEncoder) {
		encoder.AppendString("[" + level.String() + "]")
	}

	logger2, _ := conf.Build()
	logger2.Info("service start")

	logger2.Info("log info msg",
		zap.String("name", "谢清照"),
		zap.Int("age", 16),
		zap.Duration("timer", time.Minute),
	)

}
